package My

//
//import (
//	"fmt"
//	esa "db2s/encryptionAlgorithm"
//	"db2s/global"
//	"reflect"
//	"strconv"
//	"strings"
//	"sync"
//	"time"
//	"unicode"
//)
//
//type ReadFile struct {
//	RowsSplistFay string   `json:"rowsS"`
//	CreateFileName      []string `json:"fileName"`
//	Curry         int      `json:"curry"`
//}
//type HotSql struct {
//	File ReadFile
//}
//
//func (my HotSql) getSlowLog() (fileMearge chan *string) {
//	var (
//		wg sync.WaitGroup
//	)
//	fileMearge = make(chan *string, 10000)
//	go func() {
//		for _, v := range my.File.CreateFileName {
//			wg.Add(1)
//			go func(file string) {
//				defer wg.Done()
//				//ff := outPut.FileOut("text", map[string]any{"fileName": file, "rowsS": my.File.RowsSplistFay, "curry": my.File.Curry, "queue": 100})
//				//readBuff := ff.Read1().(chan *string)
//				//for {
//				//	select {
//				//	case read, ok := <-readBuff:
//				//		if !ok {
//				//			return
//				//		}
//				//		if len(*read) == 0 {
//				//			continue
//				//		}
//				//		fileMearge <- read
//				//	}
//				//}
//			}(v)
//		}
//		wg.Wait()
//		close(fileMearge)
//	}()
//	return
//}
//func findFirstHashDigitOrCharacter(str string) (int, bool) {
//	for i, char := range str {
//		if char == '#' || unicode.IsDigit(char) || unicode.IsLetter(char) {
//			return i, true
//		}
//	}
//	return -1, false
//}
//func findLastDigitLetterSpecialChar(str string) (int, bool) {
//	lastIndex := -1
//
//	for i := len(str) - 1; i >= 0; i-- {
//		char := rune(str[i])
//		if unicode.IsDigit(char) || unicode.IsLetter(char) || !unicode.IsLetter(char) && !unicode.IsDigit(char) {
//			lastIndex = i
//			break
//		}
//	}
//
//	return lastIndex, lastIndex != -1
//}
//
//// SqlHash 对sql语句进行hash
//func (my HotSql) SqlHash(str string) string {
//	// 去除换行符
//	str = strings.ReplaceAll(str, "\n", "")
//
//	// 去除空格
//	str = strings.ReplaceAll(str, " ", "")
//	return esa.CheckSum().CheckSha1(str)
//}
//func (my HotSql) stringToTime(dateString string) string {
//	if len(dateString) == 0 {
//		return ""
//	}
//	dateString = strings.ReplaceAll(dateString, "T", " ")
//	if n := strings.Index(dateString, "+"); n != -1 {
//		dateString = dateString[:n]
//	}
//	if n := strings.Index(dateString, "."); n != -1 {
//		dateString = dateString[:n]
//	}
//	location, err := time.LoadLocation("UTC")
//	if err != nil {
//		fmt.Println("无法加载时区:", err)
//		return ""
//	}
//	// 使用ParseInLocation函数将字符串按照指定时区解析为时间对象
//	layout := "2006-01-02 15:04:05"
//	// 使用Parse函数将字符串转换为时间对象
//	dateTime, err := time.ParseInLocation(layout, dateString, location)
//	if err != nil {
//		fmt.Println("日期时间格式不匹配:", err)
//		return ""
//	}
//	time1 := fmt.Sprintf("%v", dateTime)
//	if n := strings.Index(time1, "+"); n != -1 {
//		time1 = time1[:n]
//	}
//	return strings.TrimSpace(time1)
//}
//func (my HotSql) stringToFloat(s1 string) float64 {
//	num1, err := strconv.ParseFloat(s1, 64)
//	if err != nil {
//		fmt.Println("无法将字符串转换为浮点数:", "str1:", s1, "err:", err)
//		return 0
//	}
//	return num1
//}
//
//func (my HotSql) elapTimePerms(s1, s2 string, count int) string {
//	// 将字符串转换为浮点数
//	num1, err := strconv.ParseFloat(s1, 64)
//	if err != nil {
//		fmt.Println("无法将字符串转换为浮点数:", "str1:", s1, "err:", err)
//		return "0"
//	}
//
//	num2, err := strconv.ParseFloat(s2, 64)
//	if err != nil {
//		fmt.Println("无法将字符串转换为浮点数:", "str2:", s2, "err:", err)
//		return "0"
//	}
//	// 计算累加结果
//	result := num1 + num2
//	// 除以整数
//	result = result / float64(count)
//	return fmt.Sprintf("%v", result)
//}
//func (my HotSql) userDispos(userhost string) string {
//	if len(userhost) == 0 {
//		return ""
//	}
//	userhost = strings.ReplaceAll(userhost, " ", "")
//	u := strings.Split(userhost, "@")
//	user := u[0]
//	host := u[1]
//	host = strings.ReplaceAll(host, "[", "")
//	host = strings.ReplaceAll(host, "]", "")
//	n := strings.Index(user, "[")
//	if n != -1 {
//		user = user[n+1:]
//	}
//	user = strings.ReplaceAll(user, "]", "")
//	return fmt.Sprintf("%v@%v", user, host)
//}
//
//// 解析慢查询日志行
//func (my HotSql) parseSlowLogEvent(line *string) *global.SlowLogEntry {
//	var (
//		slowLogEntryMap = make(map[string]any)
//		slowLogEntry    = global.SlowLogEntry{}
//	)
//	keyWord := global.StructNameJsonToSlice(global.SlowLogEntry{})
//	slowLog := *line
//	for {
//		if len(keyWord) < 2 {
//			break
//		}
//		n := strings.Index(slowLog, keyWord[1].(string))
//		if n == -1 {
//			if len(keyWord) > 1 {
//				keyWord = keyWord[1:]
//				continue
//			}
//			break
//		}
//		indicatorResults := slowLog[:n]
//		if i, b := findFirstHashDigitOrCharacter(indicatorResults); b {
//			indicatorResults = indicatorResults[i:]
//		}
//		if i, b := findLastDigitLetterSpecialChar(indicatorResults); b {
//			indicatorResults = indicatorResults[:i]
//		}
//		indicatorResults = strings.ReplaceAll(indicatorResults, "\r", "")
//		n1 := strings.Index(indicatorResults, keyWord[0].(string))
//		if n1 != -1 {
//			indicatorResults = indicatorResults[n1+len(keyWord[0].(string)):]
//		}
//		indicatorResults = strings.TrimSpace(indicatorResults)
//		slowLogEntryMap[keyWord[0].(string)] = indicatorResults
//		keyWord = keyWord[1:]
//		slowLog = slowLog[n:]
//	}
//	if i, b := findFirstHashDigitOrCharacter(slowLog); b {
//		slowLog = slowLog[i:]
//	}
//	if i, b := findLastDigitLetterSpecialChar(slowLog); b {
//		slowLog = slowLog[:i]
//	}
//	if len(slowLog) > 0 {
//		var s1 string
//		if len(slowLog) > 8 {
//			s1 = strings.ToLower(slowLog[:8])
//		} else {
//			s1 = strings.ToLower(slowLog)
//		}
//		for _, v := range []string{"select", "update", "set", "alter", "delete", "insert", "drop", "create", "truncate", "grant", "lock", "show"} {
//			if strings.HasPrefix(s1, v) {
//				slowLogEntryMap["queryType"] = v
//				slowLogEntryMap["querySql"] = slowLog
//			}
//		}
//	}
//	if err := global.MapToStructJson(slowLogEntryMap, &slowLogEntry); err != nil {
//		fmt.Println("--------errr:", err)
//		return nil
//	}
//	slowLogEntry.HashSql = my.SqlHash(slowLogEntry.QuerySql)
//	if len(slowLogEntry.QuerySql) == 0 {
//		slowLogEntry = global.SlowLogEntry{}
//	}
//	slowLogEntry.Time = my.stringToTime(slowLogEntry.Time)
//	slowLogEntry.UserHost = my.userDispos(slowLogEntry.UserHost)
//	return &slowLogEntry
//}
//func isEmptyStruct(Ss interface{}) bool {
//	var (
//		status = true
//	)
//	value := reflect.ValueOf(Ss)
//	if value.Kind() != reflect.Struct {
//		return true
//	}
//	for i := 0; i < value.NumField(); i++ {
//		field := value.Field(i)
//		zeroValue := reflect.Zero(field.Type())
//		if !reflect.DeepEqual(field.Interface(), zeroValue.Interface()) {
//			status = false
//			break
//		}
//	}
//	return status
//}
//
//func (my HotSql) parseSlowLogEntry() (slowLogEvent chan *global.SlowLogEntry) {
//	slowLogEvent = make(chan *global.SlowLogEntry, 10000)
//	go func() {
//		slowLog := my.getSlowLog()
//		var curry = make(chan struct{}, my.File.Curry)
//		for {
//			select {
//			case c1, ok := <-slowLog:
//				if !ok {
//					if len(curry) == 0 {
//						close(slowLogEvent)
//						return
//					}
//				} else {
//					curry <- struct{}{}
//					go func(c *string) {
//						defer func() {
//							<-curry
//						}()
//						l := my.parseSlowLogEvent(c)
//						if !isEmptyStruct(*l) {
//							slowLogEvent <- l
//						}
//					}(c1)
//				}
//			}
//		}
//	}()
//	return
//}
//
//// ReadFileAble read hot sql in file
//func (my HotSql) ReadFileAble() any {
//	var wg sync.WaitGroup
//	var resultMarge = make(chan *global.HostSQL, 10000)
//	var queryMarge = make(map[string]*global.HostSQL)
//	wg.Add(1)
//	go func() {
//		Event := my.parseSlowLogEntry()
//		for {
//			select {
//			case c, ok := <-Event:
//				if !ok {
//					wg.Done()
//					return
//				}
//				if v1, ok1 := queryMarge[c.HashSql]; ok1 {
//					v1.SqlGarth = append(v1.SqlGarth, c)
//					v1.Executions += 1
//					v1.ElaptimePerms = my.elapTimePerms(fmt.Sprintf("%v", v1.ElaptimePerms), c.QueryTime, len(v1.SqlGarth))
//				} else {
//					queryMarge[c.HashSql] = &global.HostSQL{
//						User:          c.UserHost,
//						SqlId:         "1",
//						SqlText:       c.QuerySql,
//						ElaptimePerms: c.QueryTime,
//						SqlType:       c.QueryType,
//						HashSql:       c.HashSql,
//						SqlGarth:      []*global.SlowLogEntry{c},
//						Executions:    1,
//					}
//				}
//			}
//		}
//	}()
//	wg.Wait()
//	go func() {
//		for _, v := range queryMarge {
//			resultMarge <- v
//		}
//		close(resultMarge)
//	}()
//	return resultMarge
//
//}
//
//// ReadTableAble read hot sql in file
//func (my HotSql) ReadTableAble() any {
//	return nil
//}
//
//func (my HotSql) PlayBackAble(v any) any {
//	return nil
//}
